{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "\n",
    "import math\n",
    "\n",
    "from IPython import display\n",
    "from matplotlib import cm\n",
    "from matplotlib import gridspec\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn import metrics\n",
    "import tensorflow as tf\n",
    "from tensorflow.python.data import Dataset\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.ERROR)\n",
    "pd.options.display.max_rows = 10\n",
    "pd.options.display.float_format = '{:.1f}'.format\n",
    "\n",
    "california_housing_dataframe = pd.read_csv(\"https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv\", sep=\",\")\n",
    "\n",
    "california_housing_dataframe = california_housing_dataframe.reindex(\n",
    "    np.random.permutation(california_housing_dataframe.index))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def preprocess_features(california_housing_dataframe):\n",
    "  \"\"\"Prepares input features from California housing data set.\n",
    "\n",
    "  Args:\n",
    "    california_housing_dataframe: A Pandas DataFrame expected to contain data\n",
    "      from the California housing data set.\n",
    "  Returns:\n",
    "    A DataFrame that contains the features to be used for the model, including\n",
    "    synthetic features.\n",
    "  \"\"\"\n",
    "  selected_features = california_housing_dataframe[\n",
    "    [\"latitude\",\n",
    "     \"longitude\",\n",
    "     \"housing_median_age\",\n",
    "     \"total_rooms\",\n",
    "     \"total_bedrooms\",\n",
    "     \"population\",\n",
    "     \"households\",\n",
    "     \"median_income\"]]\n",
    "  processed_features = selected_features.copy()\n",
    "  # Create a synthetic feature.\n",
    "  processed_features[\"rooms_per_person\"] = (\n",
    "    california_housing_dataframe[\"total_rooms\"] /\n",
    "    california_housing_dataframe[\"population\"])\n",
    "  return processed_features\n",
    "\n",
    "def preprocess_targets(california_housing_dataframe):\n",
    "  \"\"\"Prepares target features (i.e., labels) from California housing data set.\n",
    "\n",
    "  Args:\n",
    "    california_housing_dataframe: A Pandas DataFrame expected to contain data\n",
    "      from the California housing data set.\n",
    "  Returns:\n",
    "    A DataFrame that contains the target feature.\n",
    "  \"\"\"\n",
    "  output_targets = pd.DataFrame()\n",
    "  # Scale the target to be in units of thousands of dollars.\n",
    "  output_targets[\"median_house_value\"] = (\n",
    "    california_housing_dataframe[\"median_house_value\"] / 1000.0)\n",
    "  return output_targets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training examples summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>rooms_per_person</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>35.6</td>\n",
       "      <td>-119.6</td>\n",
       "      <td>28.6</td>\n",
       "      <td>2658.6</td>\n",
       "      <td>541.5</td>\n",
       "      <td>1437.2</td>\n",
       "      <td>503.0</td>\n",
       "      <td>3.9</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.1</td>\n",
       "      <td>2.0</td>\n",
       "      <td>12.6</td>\n",
       "      <td>2215.8</td>\n",
       "      <td>426.2</td>\n",
       "      <td>1179.6</td>\n",
       "      <td>388.4</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>32.5</td>\n",
       "      <td>-124.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>33.9</td>\n",
       "      <td>-121.8</td>\n",
       "      <td>18.0</td>\n",
       "      <td>1465.0</td>\n",
       "      <td>297.0</td>\n",
       "      <td>790.0</td>\n",
       "      <td>282.0</td>\n",
       "      <td>2.6</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>34.3</td>\n",
       "      <td>-118.5</td>\n",
       "      <td>29.0</td>\n",
       "      <td>2140.0</td>\n",
       "      <td>434.0</td>\n",
       "      <td>1168.0</td>\n",
       "      <td>409.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>37.7</td>\n",
       "      <td>-118.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>3157.2</td>\n",
       "      <td>648.0</td>\n",
       "      <td>1729.0</td>\n",
       "      <td>606.2</td>\n",
       "      <td>4.8</td>\n",
       "      <td>2.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>41.9</td>\n",
       "      <td>-114.5</td>\n",
       "      <td>52.0</td>\n",
       "      <td>37937.0</td>\n",
       "      <td>6445.0</td>\n",
       "      <td>35682.0</td>\n",
       "      <td>6082.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>55.2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       latitude  longitude  housing_median_age  total_rooms  total_bedrooms  \\\n",
       "count   12000.0    12000.0             12000.0      12000.0         12000.0   \n",
       "mean       35.6     -119.6                28.6       2658.6           541.5   \n",
       "std         2.1        2.0                12.6       2215.8           426.2   \n",
       "min        32.5     -124.3                 1.0          2.0             2.0   \n",
       "25%        33.9     -121.8                18.0       1465.0           297.0   \n",
       "50%        34.3     -118.5                29.0       2140.0           434.0   \n",
       "75%        37.7     -118.0                37.0       3157.2           648.0   \n",
       "max        41.9     -114.5                52.0      37937.0          6445.0   \n",
       "\n",
       "       population  households  median_income  rooms_per_person  \n",
       "count     12000.0     12000.0        12000.0           12000.0  \n",
       "mean       1437.2       503.0            3.9               2.0  \n",
       "std        1179.6       388.4            1.9               1.3  \n",
       "min           3.0         2.0            0.5               0.0  \n",
       "25%         790.0       282.0            2.6               1.5  \n",
       "50%        1168.0       409.0            3.5               1.9  \n",
       "75%        1729.0       606.2            4.8               2.3  \n",
       "max       35682.0      6082.0           15.0              55.2  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation examples summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>rooms_per_person</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>35.6</td>\n",
       "      <td>-119.6</td>\n",
       "      <td>28.7</td>\n",
       "      <td>2607.9</td>\n",
       "      <td>534.5</td>\n",
       "      <td>1411.3</td>\n",
       "      <td>496.9</td>\n",
       "      <td>3.9</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.1</td>\n",
       "      <td>2.0</td>\n",
       "      <td>12.6</td>\n",
       "      <td>2091.2</td>\n",
       "      <td>410.0</td>\n",
       "      <td>1067.7</td>\n",
       "      <td>375.1</td>\n",
       "      <td>1.9</td>\n",
       "      <td>0.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>32.5</td>\n",
       "      <td>-124.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>33.9</td>\n",
       "      <td>-121.8</td>\n",
       "      <td>18.0</td>\n",
       "      <td>1453.0</td>\n",
       "      <td>295.0</td>\n",
       "      <td>788.0</td>\n",
       "      <td>279.0</td>\n",
       "      <td>2.6</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>34.2</td>\n",
       "      <td>-118.5</td>\n",
       "      <td>29.0</td>\n",
       "      <td>2105.0</td>\n",
       "      <td>432.5</td>\n",
       "      <td>1164.0</td>\n",
       "      <td>408.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>37.7</td>\n",
       "      <td>-118.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>3135.2</td>\n",
       "      <td>650.0</td>\n",
       "      <td>1705.0</td>\n",
       "      <td>600.2</td>\n",
       "      <td>4.8</td>\n",
       "      <td>2.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>42.0</td>\n",
       "      <td>-114.3</td>\n",
       "      <td>52.0</td>\n",
       "      <td>30405.0</td>\n",
       "      <td>4957.0</td>\n",
       "      <td>13251.0</td>\n",
       "      <td>4616.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>27.1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       latitude  longitude  housing_median_age  total_rooms  total_bedrooms  \\\n",
       "count    5000.0     5000.0              5000.0       5000.0          5000.0   \n",
       "mean       35.6     -119.6                28.7       2607.9           534.5   \n",
       "std         2.1        2.0                12.6       2091.2           410.0   \n",
       "min        32.5     -124.3                 1.0          8.0             1.0   \n",
       "25%        33.9     -121.8                18.0       1453.0           295.0   \n",
       "50%        34.2     -118.5                29.0       2105.0           432.5   \n",
       "75%        37.7     -118.0                37.0       3135.2           650.0   \n",
       "max        42.0     -114.3                52.0      30405.0          4957.0   \n",
       "\n",
       "       population  households  median_income  rooms_per_person  \n",
       "count      5000.0      5000.0         5000.0            5000.0  \n",
       "mean       1411.3       496.9            3.9               2.0  \n",
       "std        1067.7       375.1            1.9               0.9  \n",
       "min           8.0         1.0            0.5               0.2  \n",
       "25%         788.0       279.0            2.6               1.5  \n",
       "50%        1164.0       408.0            3.5               1.9  \n",
       "75%        1705.0       600.2            4.8               2.3  \n",
       "max       13251.0      4616.0           15.0              27.1  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training targets summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>median_house_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>12000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>207.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>116.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>15.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>119.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>180.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>265.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>500.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       median_house_value\n",
       "count             12000.0\n",
       "mean                207.3\n",
       "std                 116.2\n",
       "min                  15.0\n",
       "25%                 119.6\n",
       "50%                 180.0\n",
       "75%                 265.0\n",
       "max                 500.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation targets summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>median_house_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>207.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>115.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>15.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>119.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>181.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>264.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>500.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       median_house_value\n",
       "count              5000.0\n",
       "mean                207.2\n",
       "std                 115.5\n",
       "min                  15.0\n",
       "25%                 119.2\n",
       "50%                 181.1\n",
       "75%                 264.6\n",
       "max                 500.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Choose the first 12000 (out of 17000) examples for training.\n",
    "training_examples = preprocess_features(california_housing_dataframe.head(12000))\n",
    "training_targets = preprocess_targets(california_housing_dataframe.head(12000))\n",
    "\n",
    "# Choose the last 5000 (out of 17000) examples for validation.\n",
    "validation_examples = preprocess_features(california_housing_dataframe.tail(5000))\n",
    "validation_targets = preprocess_targets(california_housing_dataframe.tail(5000))\n",
    "\n",
    "# Double-check that we've done the right thing.\n",
    "print(\"Training examples summary:\")\n",
    "display.display(training_examples.describe())\n",
    "print(\"Validation examples summary:\")\n",
    "display.display(validation_examples.describe())\n",
    "\n",
    "print(\"Training targets summary:\")\n",
    "display.display(training_targets.describe())\n",
    "print(\"Validation targets summary:\")\n",
    "display.display(validation_targets.describe())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assignment 1: 构建良好的特征集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>rooms_per_person</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>latitude</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>longitude</th>\n",
       "      <td>-0.9</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>housing_median_age</th>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.4</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>total_rooms</th>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.9</td>\n",
       "      <td>0.9</td>\n",
       "      <td>0.9</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>total_bedrooms</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>0.9</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.9</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>population</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>0.9</td>\n",
       "      <td>0.9</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>households</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>0.9</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.9</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>median_income</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.2</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rooms_per_person</th>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>target</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.7</td>\n",
       "      <td>0.2</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    latitude  longitude  housing_median_age  total_rooms  \\\n",
       "latitude                 1.0       -0.9                 0.0         -0.0   \n",
       "longitude               -0.9        1.0                -0.1          0.0   \n",
       "housing_median_age       0.0       -0.1                 1.0         -0.4   \n",
       "total_rooms             -0.0        0.0                -0.4          1.0   \n",
       "total_bedrooms          -0.1        0.1                -0.3          0.9   \n",
       "population              -0.1        0.1                -0.3          0.9   \n",
       "households              -0.1        0.1                -0.3          0.9   \n",
       "median_income           -0.1       -0.0                -0.1          0.2   \n",
       "rooms_per_person         0.1       -0.1                -0.1          0.1   \n",
       "target                  -0.1       -0.0                 0.1          0.1   \n",
       "\n",
       "                    total_bedrooms  population  households  median_income  \\\n",
       "latitude                      -0.1        -0.1        -0.1           -0.1   \n",
       "longitude                      0.1         0.1         0.1           -0.0   \n",
       "housing_median_age            -0.3        -0.3        -0.3           -0.1   \n",
       "total_rooms                    0.9         0.9         0.9            0.2   \n",
       "total_bedrooms                 1.0         0.9         1.0           -0.0   \n",
       "population                     0.9         1.0         0.9            0.0   \n",
       "households                     1.0         0.9         1.0            0.0   \n",
       "median_income                 -0.0         0.0         0.0            1.0   \n",
       "rooms_per_person               0.0        -0.1        -0.0            0.2   \n",
       "target                         0.0        -0.0         0.1            0.7   \n",
       "\n",
       "                    rooms_per_person  target  \n",
       "latitude                         0.1    -0.1  \n",
       "longitude                       -0.1    -0.0  \n",
       "housing_median_age              -0.1     0.1  \n",
       "total_rooms                      0.1     0.1  \n",
       "total_bedrooms                   0.0     0.0  \n",
       "population                      -0.1    -0.0  \n",
       "households                      -0.0     0.1  \n",
       "median_income                    0.2     0.7  \n",
       "rooms_per_person                 1.0     0.2  \n",
       "target                           0.2     1.0  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "correlation_dataframe = training_examples.copy()\n",
    "correlation_dataframe[\"target\"] = training_targets[\"median_house_value\"]\n",
    "\n",
    "correlation_dataframe.corr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def construct_feature_columns(input_features):\n",
    "  \"\"\"Construct the TensorFlow Feature Columns.\n",
    "\n",
    "  Args:\n",
    "    input_features: The names of the numerical input features to use.\n",
    "  Returns:\n",
    "    A set of feature columns\n",
    "  \"\"\" \n",
    "  return set([tf.feature_column.numeric_column(my_feature)\n",
    "              for my_feature in input_features])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):\n",
    "    \"\"\"Trains a linear regression model of one feature.\n",
    "  \n",
    "    Args:\n",
    "      features: pandas DataFrame of features\n",
    "      targets: pandas DataFrame of targets\n",
    "      batch_size: Size of batches to be passed to the model\n",
    "      shuffle: True or False. Whether to shuffle the data.\n",
    "      num_epochs: Number of epochs for which data should be repeated. None = repeat indefinitely\n",
    "    Returns:\n",
    "      Tuple of (features, labels) for next data batch\n",
    "    \"\"\"\n",
    "    \n",
    "    # Convert pandas data into a dict of np arrays\n",
    "    features = {key:np.array(value) for key,value in dict(features).items()}                                           \n",
    "    \n",
    "    # Construct a dataset, and configure batching/repeating\n",
    "    ds = Dataset.from_tensor_slices((features,targets)) # warning: 2GB limit\n",
    "    ds = ds.batch(batch_size).repeat(num_epochs)\n",
    "\n",
    "    # Shuffle the data, if specified\n",
    "    if shuffle:\n",
    "      ds = ds.shuffle(10000)\n",
    "    \n",
    "    # Return the next batch of data\n",
    "    features, labels = ds.make_one_shot_iterator().get_next()\n",
    "    return features, labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_model(\n",
    "    learning_rate,\n",
    "    steps,\n",
    "    batch_size,\n",
    "    training_examples,\n",
    "    training_targets,\n",
    "    validation_examples,\n",
    "    validation_targets):\n",
    "  \"\"\"Trains a linear regression model.\n",
    "  \n",
    "  In addition to training, this function also prints training progress information,\n",
    "  as well as a plot of the training and validation loss over time.\n",
    "  \n",
    "  Args:\n",
    "    learning_rate: A `float`, the learning rate.\n",
    "    steps: A non-zero `int`, the total number of training steps. A training step\n",
    "      consists of a forward and backward pass using a single batch.\n",
    "    batch_size: A non-zero `int`, the batch size.\n",
    "    training_examples: A `DataFrame` containing one or more columns from\n",
    "      `california_housing_dataframe` to use as input features for training.\n",
    "    training_targets: A `DataFrame` containing exactly one column from\n",
    "      `california_housing_dataframe` to use as target for training.\n",
    "    validation_examples: A `DataFrame` containing one or more columns from\n",
    "      `california_housing_dataframe` to use as input features for validation.\n",
    "    validation_targets: A `DataFrame` containing exactly one column from\n",
    "      `california_housing_dataframe` to use as target for validation.\n",
    "      \n",
    "  Returns:\n",
    "    A `LinearRegressor` object trained on the training data.\n",
    "  \"\"\"\n",
    "\n",
    "  periods = 10\n",
    "  steps_per_period = steps / periods\n",
    "\n",
    "  # Create a linear regressor object.\n",
    "  my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)\n",
    "  my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)\n",
    "  linear_regressor = tf.estimator.LinearRegressor(\n",
    "      feature_columns=construct_feature_columns(training_examples),\n",
    "      optimizer=my_optimizer\n",
    "  )\n",
    "    \n",
    "  # Create input functions\n",
    "  training_input_fn = lambda: my_input_fn(training_examples, \n",
    "                                          training_targets[\"median_house_value\"], \n",
    "                                          batch_size=batch_size)\n",
    "  predict_training_input_fn = lambda: my_input_fn(training_examples, \n",
    "                                                  training_targets[\"median_house_value\"], \n",
    "                                                  num_epochs=1, \n",
    "                                                  shuffle=False)\n",
    "  predict_validation_input_fn = lambda: my_input_fn(validation_examples, \n",
    "                                                    validation_targets[\"median_house_value\"], \n",
    "                                                    num_epochs=1, \n",
    "                                                    shuffle=False)\n",
    "\n",
    "  # Train the model, but do so inside a loop so that we can periodically assess\n",
    "  # loss metrics.\n",
    "  print(\"Training model...\")\n",
    "  print(\"RMSE (on training data):\")\n",
    "  training_rmse = []\n",
    "  validation_rmse = []\n",
    "  for period in range (0, periods):\n",
    "    # Train the model, starting from the prior state.\n",
    "    linear_regressor.train(\n",
    "        input_fn=training_input_fn,\n",
    "        steps=steps_per_period,\n",
    "    )\n",
    "    # Take a break and compute predictions.\n",
    "    training_predictions = linear_regressor.predict(input_fn=predict_training_input_fn)\n",
    "    training_predictions = np.array([item['predictions'][0] for item in training_predictions])\n",
    "    \n",
    "    validation_predictions = linear_regressor.predict(input_fn=predict_validation_input_fn)\n",
    "    validation_predictions = np.array([item['predictions'][0] for item in validation_predictions])\n",
    "    \n",
    "    # Compute training and validation loss.\n",
    "    training_root_mean_squared_error = math.sqrt(\n",
    "        metrics.mean_squared_error(training_predictions, training_targets))\n",
    "    validation_root_mean_squared_error = math.sqrt(\n",
    "        metrics.mean_squared_error(validation_predictions, validation_targets))\n",
    "    # Occasionally print the current loss.\n",
    "    print(\"  period %02d : %0.2f\" % (period, training_root_mean_squared_error))\n",
    "    # Add the loss metrics from this period to our list.\n",
    "    training_rmse.append(training_root_mean_squared_error)\n",
    "    validation_rmse.append(validation_root_mean_squared_error)\n",
    "  print(\"Model training finished.\")\n",
    "\n",
    "  \n",
    "  # Output a graph of loss metrics over periods.\n",
    "  plt.ylabel(\"RMSE\")\n",
    "  plt.xlabel(\"Periods\")\n",
    "  plt.title(\"Root Mean Squared Error vs. Periods\")\n",
    "  plt.tight_layout()\n",
    "  plt.plot(training_rmse, label=\"training\")\n",
    "  plt.plot(validation_rmse, label=\"validation\")\n",
    "  plt.legend()\n",
    "\n",
    "  return linear_regressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 229.91\n",
      "  period 01 : 222.25\n",
      "  period 02 : 214.69\n",
      "  period 03 : 207.24\n",
      "  period 04 : 199.92\n",
      "  period 05 : 192.74\n",
      "  period 06 : 185.71\n",
      "  period 07 : 178.86\n",
      "  period 08 : 172.20\n",
      "  period 09 : 165.76\n",
      "Model training finished.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x11972c590>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#\n",
    "# Your code here: add your features of choice as a list of quoted strings.\n",
    "#\n",
    "minimal_features = [\"median_income\",\"latitude\",]\n",
    "\n",
    "minimal_training_examples = training_examples[minimal_features]\n",
    "minimal_validation_examples = validation_examples[minimal_features]\n",
    "\n",
    "#\n",
    "# Don't forget to adjust these parameters.\n",
    "#\n",
    "train_model(\n",
    "    learning_rate=0.001,\n",
    "    steps=500,\n",
    "    batch_size=5,\n",
    "    training_examples=minimal_training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=minimal_validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assignment 2: 更好的利用纬度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x11b8bb150>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(training_examples[\"latitude\"], training_targets[\"median_house_value\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对纬度进行分桶\n",
    "LATITUDE_RANGES = zip(range(32, 44), range(33, 45))\n",
    "\n",
    "def select_and_transform_features(source_df):\n",
    "  selected_examples = pd.DataFrame()\n",
    "  selected_examples[\"median_income\"] = source_df[\"median_income\"]\n",
    "  for r in LATITUDE_RANGES:\n",
    "    selected_examples[\"latitude_%d_to_%d\" % r] = source_df[\"latitude\"].apply(\n",
    "      lambda l: 1.0 if l >= r[0] and l < r[1] else 0.0)\n",
    "  return selected_examples\n",
    "\n",
    "selected_training_examples = select_and_transform_features(training_examples)\n",
    "selected_validation_examples = select_and_transform_features(validation_examples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 227.39\n",
      "  period 01 : 217.19\n",
      "  period 02 : 207.06\n",
      "  period 03 : 197.04\n",
      "  period 04 : 187.14\n",
      "  period 05 : 177.38\n",
      "  period 06 : 167.78\n",
      "  period 07 : 158.35\n",
      "  period 08 : 149.16\n",
      "  period 09 : 140.23\n",
      "Model training finished.\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAEYCAYAAAD4czk4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xd4FGXXx/HvSSEh1NA7QYp0QghFkV5EBKkqKChYQDqICPja0IcqoiCK0lQUEUSU8iAiAlIDBAihSREQAtJ7SSDJ/f6xA88SQxIgm9lkz+e69mJ26tnZJb+9Z+6dEWMMSimllDvxsrsApZRSKiENJ6WUUm5Hw0kppZTb0XBSSinldjSclFJKuR0NJ6WUUm5Hw0mpdEJEjIiUsruO9ExE3hCRqfe47Fci8p/UrkklTsMpgxORQyJyTUQui8hx6z9Y1lRYb5D1x9IniXnetebpm2B8f2v8u/dbx90SkUdEZJ2IXBCRsyKyVkSqp3UdqU1EVopItPU+33wstLuu1GB9Vq5Yr+moiIwTEe97WZcxZoQx5qXUrlGlPg0nz9DSGJMVCAaqAkPTcNt7gecTjHvOGp+mRCQ7sAj4BMgFFAaGATE21HJPf1yT0dsYk9Xp0fIO2/7XF4qkvmSkdB0uVsX6DDcCngFevtsV2FCzug8aTh7EGHMc+BVHSAEgIjlEZIaInBKRv0XkTRHxsqZ5Wc//FpGT1nw5rEVXWf+et77RPnSHzW4CAkSkgrXOCkBma/wtItJCRCJE5LzVsqnsNG2IiPwlIpdEZJeItHGa1kVE1ojIWBE5JyIHReSxO9RSxtoPs4wxccaYa8aYpcaYSGtd3tZ6TovIARHp5dw6tFqhjZ22/a6IfOv0/AerdXpBRFbdfM3WtK9EZJKILBaRK0ADEfGztndYRE6IyOciktlpmUEi8o+IHBORF+7wmpIlIvVFJEpEBovIceDLxMZZ874sIvutVuUCESnktB5j7ZN9wL5EtrNERHonGLdNRNqKw0fW5+iCiESKSMW7fS3GmD+B1UBFa/2FRORH6/N70LmVbr0/c0XkWxG5CHRJ5D17QkR2Wp+7lSJSzmlaVRHZYn3uZgP+TtPyiMgia7mzIrL65v8blTp0Z3oQESkCPAbsdxr9CZADeACoh6NV09Wa1sV6NLCmZwUmWtPqWv/mtL6lr09i099Y6wVHK2pGgrpCgOlAdyA38AWwQET8rFn+AupYdQ4DvhWRgk6rqAnsAfIAY4BpIiKJ1LEXiBORr0XkMREJTDD9ZaAFjtZlKNA+ideUmF+A0kA+YAswM8H0Z4DhQDZgDTAaR2AGA6VwtOTeBhCRZsBrQBNrnY25PwVwtBaLA90SGyciDYGRwFNAQeBv4PsE62mNY3+XT2Qb3wEdbz4RkfLWuv8LNMXxmSkD5ASeBs7c7Yuw1lkH2GqFwUJgG4591wjoLyKPOi3SCphrbXNmgnWVAWYB/YG8wGJgoYhkEpFMwM84Pru5gB+Adk6LDwSirOXyA28Aei241GSM0UcGfgCHgMvAJRz/eX7HESgA3jgOaZV3mr87sNIa/h3o6TTtQeAG4AMEWevzSWLb7wLfAsWAw4Cv9W9Ra/y71nyTgPcTLLsHqHeH9UYArazhLsB+p2kBVl0F7rBsOeArHH9YYoEFQH5r2nLgFad5mzq/RmtfNk74+u6wnZzWsjms518BM5ymC3AFKOk07iHgoDU8HRjlNK2Mtb5Sd9jeSuAqcN7p8b41rT5wHfB3mj+xcdOAMU7Ps1rvd5D13AANk3i/s1mvqbj1fDgw3RpuiOPLQS3A6y4/wwa4CJzD8UXlPzi+WNcEDieYdyjwpdP7syqxz6Q1/BYwx2maF3DU2jd1gWOAOE1fB/zHGn4PmH+n90Mf9//QlpNnaG2MyYbjP11ZHC0MrH8z4fiGfNPfOL6FAhRKZJoPjm+KKWaMOYyjtTYC2GeMOZJgluLAQOsQyXkROY8jwAoBiMhzTof8zuM4pJPHafnjTtu6ag0m2unDGLPbGNPFGFPEWk8h4GOn1+tc298Jl78T65DgKOvw40UcQUaCOp3XnRdHkG52el1LrPH3WktfY0xOp8dbTtNOGWOiE8yfcNxt77cx5jKO1k1hp3kSvne3GGMu4WgldbBGdcBqrRhjluNodX8KnBCRyeI4B5hSIcaYQGNMSWPMm8aYeByfm0IJPjdvcPvn84718u/XG2/NX9iadtRYSWRxfg8+wPGZXmodAh5yF69FpYCGkwcxxvyB4xv8WGvUaRzfjIs7zVYMx7dHcHxzTDgtFjjB3R/CmIHjUMiMRKYdAYYn+MMaYIyZJSLFgSlAbyC3MSYnsANHy+O+GMf5i6+wzl8A/+AIxZuKJVjkCo5AuamA0/AzOA4hNcZx+DHIGu9cp/M+Ow1cAyo4veYcxnHSPyW13K3E3q+E4257v0UkC47DrEeTWCahWUBHcZyDzAysuLWgMROMMdWACjhagoNSXH3ijuBoaTp/brIZY5qnsN6Er1dw7POjOPZ/4QSHh2+9B8aYS8aYgcaYB4CWwKsi0ug+X49youHkeT4GmohIsDEmDpgDDBeRbFYQvIrjkBs4/tAMEJES4uh+PgKYbYyJBU4B8TjORaXEbByHyeYkMm0K8IqI1LROnGcRkcdFJBuQBccfmFMAItKV/4XJXRGRsiIy0Dr3hogUxXGOJMyaZQ7QV0SKWOejEn4bjgA6iIiviCQ8J5UNxyHSMzgCbERStVjf0qcAH4lIPquewk7nS+bgOIFfXkQCgHfu5TXfpe+AriISbJ3vGwFsMMYcuot1LMbxB/89HJ+VeAARqW69v744Qj4aiLvPejcCF8XRqSOz1XqtKCn/acAc4HERaWTVNRDHe7gOWI/ji1hfEfERkbZAjZsLiqMDTykrvC5ar+V+X49youHkYYwxp3C0Xm4e8umD44/FARwn6b/Dcb4D699vcPTMO4jjD0ofaz1XcZxTWGsdUqmVzHavGWOWGWOuJTItHEdnhIk4zivsx3EuCWPMLuBDHH8sTgCVgLX38NLBcd6tJrBBHD3mwnC0wgZa06fg6M24DUeHhnkJln8LKGnVOAzHvrppBo7DPkeBXfwv8JIyGMdrDbMOBS7DcV4PY8wvOL5ILLfmWZ6C9U2U23/ntDkFy9xijPkdx2v8EUfLoST/O0SX0nXE4Nhvjbl9/2THsX/P4dhPZ7Ba8OL4Yewvd7Mda1txOFotwTg+n6eBqTharilZfg/QCUenoNPWuloaY64bY64DbXF8Ds/h6MDh/HkojeP9uozjs/mZMWbl3b4GdWdy+yFVpdRNIhKE44+er9VaVEqlEW05KaWUcjsaTkoppdyOHtZTSinldrTlpJRSyu2k6wsh5smTxwQFBdldhlJKqRTavHnzaWNM3uTmS9fhFBQURHh4uN1lKKWUSiERSdGVV/SwnlJKKbej4aSUUsrtaDgppZRyO+n6nJNSSqWGGzduEBUVRXR0wgu3q3vl7+9PkSJF8PX1vaflNZyUUh4vKiqKbNmyERQUROL3qVR3wxjDmTNniIqKokSJEve0Dj2sp5TyeNHR0eTOnVuDKZWICLlz576vlqiGk1JKgQZTKrvf/enR4fTT1iiOnL2a/IxKKaXSlMeG06XoG5yb/wbDPprA5FV/ERsXb3dJSikPdv78eT777LO7Xq558+acP38+yXnefvttli1bdq+l2cJjwykb1+gcuJOp3iPJ/1tvnv9kEZFRSb/BSinlKncKp7i4pG+wu3jxYnLmzJnkPO+99x6NGze+r/rSmseGE/7Z8e21DlNvMC19NzHp/CvMmvQ+7y/cwZUYva+cUiptDRkyhL/++ovg4GCqV69OgwYNeOaZZ6hUqRIArVu3plq1alSoUIHJkyffWi4oKIjTp09z6NAhypUrx8svv0yFChVo2rQp1645bjzdpUsX5s6de2v+d955h5CQECpVqsSff/4JwKlTp2jSpAkhISF0796d4sWLc/r06TTeC//j2V3JffyQBm8gFdsTsKAvI49MZeOm1by8vRcvtW1Gw7L57a5QKZXGhi3cya5jF1N1neULZeedlhWSnGfUqFHs2LGDiIgIVq5cyeOPP86OHTtudcWePn06uXLl4tq1a1SvXp127dqRO3fu29axb98+Zs2axZQpU3jqqaf48ccf6dSp07+2lSdPHrZs2cJnn33G2LFjmTp1KsOGDaNhw4YMHTqUJUuW3BaAdvDclpOzvGXw6boYnphIiP9xvr7+Ktu/HUy/b8M4eUl/lKeUSns1atS47TdCEyZMoEqVKtSqVYsjR46wb9++fy1TokQJgoODAahWrRqHDh1KdN1t27b91zxr1qyhQ4cOADRr1ozAwMBUfDV3z7NbTs68vCCkMz5lmhG3ZCj9dvzAwX3rGfphNxo3f5KnQ4vi5aVdTZXK6JJr4aSVLFmy3BpeuXIly5YtY/369QQEBFC/fv1Ef0Pk5+d3a9jb2/vWYb07zeft7U1srOM0hrvdeFZbTgllzYt3+6nQaR5FcvgxjffwWdCLlz5fyv6Tl+yuTimVQWXLlo1LlxL/G3PhwgUCAwMJCAjgzz//JCwsLNW3/8gjjzBnzhwAli5dyrlz51J9G3dDw+lOSjXCt3cYpvYA2vmuY+zJF5k8YQQfLd1DTGzSvWeUUupu5c6dm9q1a1OxYkUGDRp027RmzZoRGxtL5cqVeeutt6hVq1aqb/+dd95h6dKlhISE8Msvv1CwYEGyZcuW6ttJKXG3ptzdCA0NNWlys8ETO7kxvy++x8JZE1eBydl706vdo9R8IHfyyyql3N7u3bspV66c3WXYKiYmBm9vb3x8fFi/fj09evQgIiLivtaZ2H4Vkc3GmNDkltVzTimRvwK+L/0Gm6dTa+k7VL/SlwnT2rCw6isMal6ZHAH3dtVdpZRyF4cPH+app54iPj6eTJkyMWXKFFvr0XBKKS8vqP4SPg8+DosHM+jPOeyNXMuru3vS+om2tKhcUK/NpZRKt0qXLs3WrVvtLuMWPed0t7IXxKfDDOg4m6DsMC3u/7j0Qy96T1tO1Dm9Tp9SSqUGDad79WAzMvXZSHytXnTwWcmwI10Z99Eopup1+pRS6r5pON0Pv6x4NRuBV7cVZM9fnHFe4yn5W1de+WQeO45esLs6pZRKt1wWTiJSVERWiMhuEdkpIv2s8R+IyJ8iEikiP4lITqdlhorIfhHZIyKPuqq2VFcomEzdV2AeHUGdTPuYeL4HCycNZsSiSK5e1+v0KaXU3XJlyykWGGiMKQfUAnqJSHngN6CiMaYysBcYCmBN6wBUAJoBn4mItwvrS13ePshDvfDpuwnvUg0Z6jOL1hs70XfsVFbsOWl3dUqpDCZr1qwAHDt2jPbt2yc6T/369Unu5zYff/wxV6/+73x5Sm7BkRZcFk7GmH+MMVus4UvAbqCwMWapMeZmcyIMKGINtwK+N8bEGGMOAvuBGq6qz2VyFMH32e/hqW8olTWaydeHcOib3gz6dg2nLsXYXZ1SKoMpVKjQrSuO34uE4ZSSW3CkhTQ55yQiQUBVYEOCSS8Av1jDhYEjTtOirHEJ19VNRMJFJPzUqVOpX2xqEIHyT5Cp7yZM6It08VnKwH2d+c+HY5i96bDbXcNKKWW/wYMH33Y/p3fffZdhw4bRqFGjW7e3mD9//r+WO3ToEBUrVgTg2rVrdOjQgcqVK/P000/fdm29Hj16EBoaSoUKFXjnnXcAx8Vkjx07RoMGDWjQoAHwv1twAIwbN46KFStSsWJFPv7441vbu9OtOVKTy3/nJCJZgR+B/saYi07j/w/Hob+ZN0clsvi//oobYyYDk8FxhYhULzg1+efAu8WHUKUDgT/3YfyZsSxdsIKem/rz2pMNKZk3q90VKqUS+mUIHN+euussUAkeG5XkLB06dKB///707NkTgDlz5rBkyRIGDBhA9uzZOX36NLVq1eKJJ564428qJ02aREBAAJGRkURGRhISEnJr2vDhw8mVKxdxcXE0atSIyMhI+vbty7hx41ixYgV58uS5bV2bN2/myy+/ZMOGDRhjqFmzJvXq1SMwMDDFt+a4Hy5tOYmIL45gmmmMmec0/nmgBfCs+V8zIgoo6rR4EeCYK+tLM0Wr49dzNfGNhtHQdydjT77MdxPeYMJvf+p1+pRSAFStWpWTJ09y7Ngxtm3bRmBgIAULFuSNN96gcuXKNG7cmKNHj3LixIk7rmPVqlW3QqJy5cpUrlz51rQ5c+YQEhJC1apV2blzJ7t27UqynjVr1tCmTRuyZMlC1qxZadu2LatXrwZSfmuO++GylpM4on0asNsYM85pfDNgMFDPGOP8q9UFwHciMg4oBJQGNrqqvjTn7YtXnf54VWhF3IIBvHXoayJWr6ZvRF9eerIV1YNy2V2hUgqSbeG4Uvv27Zk7dy7Hjx+nQ4cOzJw5k1OnTrF582Z8fX0JCgpK9FYZzhJrVR08eJCxY8eyadMmAgMD6dKlS7LrSer0Q0pvzXE/XNlyqg10BhqKSIT1aA5MBLIBv1njPgcwxuwE5gC7gCVAL2NMxmtW5CqB3/M/QbtplM98gU+vvMqWqb15Z+5GLly7YXd1SikbdejQge+//565c+fSvn17Lly4QL58+fD19WXFihX8/fffSS5ft25dZs50nCnZsWMHkZGRAFy8eJEsWbKQI0cOTpw4wS+//HJrmTvdqqNu3br8/PPPXL16lStXrvDTTz9Rp06dVHy1SXNZy8kYs4bEzyMtTmKZ4cBwV9XkNkSgUnsylWxI7NJ36B4xg6jtG3h7dzeatnqO5pUK6HX6lPJAFSpU4NKlSxQuXJiCBQvy7LPP0rJlS0JDQwkODqZs2bJJLt+jRw+6du1K5cqVCQ4OpkYNR4fnKlWqULVqVSpUqMADDzxA7dq1by3TrVs3HnvsMQoWLMiKFStujQ8JCaFLly631vHSSy9RtWpVlxzCS4zeMsMd/L2O6J/64H9+P4viavF78QEMbFeXIoEBdlemlEfQW2a4xv3cMkMvX+QOij+Mf+91xNV7g2a+W3jvSBemffQmU1ft1+v0KaU8koaTu/Dxw7vBYHx6rse3aDXe8ZpGyLKn6T/hW7ZH6XX6lFKeRcPJ3eQphf+LizCtP6eC/xk+vtCPdZ/3YsTP4VyO0ev0KeUq6fkUhzu63/2p4eSORJDgjvj130J85Y5091lI560dePuDcSzdedzu6pTKcPz9/Tlz5owGVCoxxnDmzBn8/f3veR3aISI9OLSWaz/1IfOFv1gUV5NVD7zKq23rUyDHvb/xSqn/uXHjBlFRUcn+9kelnL+/P0WKFMHX1/e28SntEKHhlF7ExhC3Zjzmjw+4Fu/NeDpStEkvOj1cEm8v7XaulEoftLdeRuPjh3f91/HpHYZPseq8KdOpsvQpBn7yDbuOXUx+eaWUSkc0nNKb3CXJ/MICTJvJlPM/x9hz/Vg7qQdjF27RGxsqpTIMDaf0SASp8jR+/TcTV/lZXvZeRIfwJ3l37Id6Y0OlVIag4ZSeBeTCr+1E6LqEXDkDGXN9BNe+fZb/+/pXTl7SE7tKqfRLwykjKP4QAX3WEVv/TZr6bmPogeeZ+uFQvgs7QHx8+u3wopTyXBpOGYVPJnzqD8KndxhexWrwBtMpv7gdgyd+w94T/77isFJKuTMNp4wm1wMEvDAf03YqZf0vMOpsX1ZP7MbHi7cQfSPj3YFEKZUxaThlRCJI5SfxH7CZG5U786L3Yp7c0J5hY8eyZt9pu6tTSqlkaThlZJkD8W/7CbzwK4E5czEyZgSXZ3Tg3W+XcuZyjN3VKaXUHWk4eYJitQjos44bDd6mkW8kr+3rzNQPB/PDpkN6LTGllFvScPIUPpnwrTcQ394bkGI1GWy+pMzCNgz99Bv+OnXZ7uqUUuo2Gk6eJlcJsrwwn/h20ynjf4Hhp/uyasJLfLpkKzGx2mFCKeUeNJw8kQheldqRecAWrld5jq7ev9BmfVveHzuWsANn7K5OKaU0nDxa5pxkbjMBXvyN7Dnz8p/oEVz48imGf7eU81ev212dUsqDaTgpKFqDrH3XcqPBuzT03U6/PZ2Z+sEgft6sHSaUUvbQcFIO3r741huAb5+NUOwhXjNfUXJ+K97+/Fv+PnPF7uqUUh5Gw0ndLjCIrC/8RFz7ryjpf5l3j/fhj/Ev8MXSCK7HxttdnVLKQ2g4qX8TwbtiGwJe3UJMcBc6ef3KE2vbMPLD0Wz4S68woZRyPQ0ndWf+OQho8zFeLy0ja2B+3rk2iitftWPEzF84d0U7TCilXEfDSSWvSCjZ+qzheuPh1Pbdy4C9z/Ht2H7M3XhAO0wopVxCw0mljLcPmR7pjV+/cG6UbEwf8x1VFrVg2CdT2H9SrzChlEpdGk7q7uQoTPbnZhHfYTYFs8C7ZwcRMfEZPvvvBr0lh1Iq1Wg4qXviVbYZWQeEc7VGX9p4raHjxraM/+BtVu89YXdpSqkMQMNJ3btMAQQ0fx/vnmvxyleWwdcn4vdtS0Z+9SMnL0XbXZ1SKh3TcFL3L185cvT4jRstPqFSpuO8dvBlFn7YjVlrdhMfrx0mlFJ3T8NJpQ4vL3xDnyPzgK1cK/8kLzKfOr+1YMTHH7Hr2EW7q1NKpTMaTip1ZclN9qe/wHRZTPbsOXjz4jCOfN6WCfNWcCUm1u7qlFLphIaTcgkJqk32fmFcq/smDbwjeXHb00wbM5BlO47aXZpSKh3QcFKu45OJzA0HkanvRm4UfZi+cV9RaM5jjJw8g2Pnr9ldnVLKjWk4KdcLDCLniz8R234GxfyvMfhoX1Z/1IkZyyOIjdOLySql/s1l4SQiRUVkhYjsFpGdItLPGp9LRH4TkX3Wv4HWeBGRCSKyX0QiRSTEVbUpG4jgU7EVWQdu4UrVl3lSlvPYHy0Z9+F/iDh8zu7qlFJuxpUtp1hgoDGmHFAL6CUi5YEhwO/GmNLA79ZzgMeA0tajGzDJhbUpu/hlI1vrD5BuK/DNFcTrVz/kytTHGT/7v1yMvmF3dUopN+GycDLG/GOM2WINXwJ2A4WBVsDX1mxfA62t4VbADOMQBuQUkYKuqk/ZSwoFk7PPSqIf/YBqvn/zyq7nmD2mB//dclAvJquUSptzTiISBFQFNgD5jTH/gCPAgHzWbIWBI06LRVnjEq6rm4iEi0j4qVOnXFm2cjUvb/wf6oZ//y1cLdWCl+N/oPzPj/LBZ59z+MxVu6tTStnI5eEkIlmBH4H+xpikfo0piYz711doY8xkY0yoMSY0b968qVWmslO2/AR2/pq4Tj+TK6sfr58awrbx7fjy1zC9+65SHsql4SQivjiCaaYxZp41+sTNw3XWvyet8VFAUafFiwDHXFmfci/epRqQY8AmLtUaRDOvTbRb15rPxw5l41/aQlbK07iyt54A04DdxphxTpMWAM9bw88D853GP2f12qsFXLh5+E95EF9/sjV7E98+G4gtUJW+0Z+T6eumjP9mjt59VykPIq46+SwijwCrge3AzWMzb+A47zQHKAYcBp40xpy1wmwi0Ay4CnQ1xoQntY3Q0FATHp7kLCo9M4aYiDncWDyEzNfPMdurOQGPvk2rmg/i+LgopdIbEdlsjAlNdr703DNKw8lDXDvPuUVvkWPnN5w0OZmVqyctO/SgVP5sdlemlLpLKQ0nvUKEcn+ZcxL45Cfw4jIyZc/PgHPDifq0BVPmL9e77yqVQWk4qXTDq2goufqv5XKD/1DLZw+dtzzFN2N6s3LnkeQXVkqlKxpOKn3x9iFrvT7499/C5eJNePnGdxSd3YTxkyfzzwW9mKxSGYWGk0qfshcizwuzuN7xB3IH+NDv2CC2jmvDd8vC9GKySmUAGk4qXcv0YFNyDgznfM1BNJFwWq5uzZSxr7P5oP42Sqn0TMNJpX++/uR87E18+mwgukA1elybgv+Xjfjsm1mcv6q/jVIqPdJwUhmG5C5J3lcWEd3mS4r6XaXnX6+w/IOOzF+3XS8mq1Q6o+GkMhYR/Ku0JftrWzlTuRutzHIe+fUxJn30HnuPX7C7OqVUCmk4qYzJLxu5236AdF9NfK5S9Lw4joufNWHqjwu4ej3W7uqUUsnQcFIZmlfBiuTts5zLzcZTzvc4XSKfZ/7orvwesd/u0pRSSdBwUhmflxdZa3Uhy8AIzj74FB3jFlD+pyZM+uxDos5esbs6pVQiNJyU5wjIRb5nviC261J8s+Whx8n3ODD+MWYuXqH3jVLKzWg4KY/jU7wmeQas53y996nutY/2G55k1gc92bhPbx+mlLvQcFKeyduHnA36knnAFs4Vb8rzMbPI+019vpg+hTOXY+yuTimPp+GkPFv2ghR44TtiOv5IjoBMdD/8GuFjW/HTH5uIj9ffRillFw0npQC/BxuT67XNnK4xiAZspsnyFnw1bhC7os7aXZpSHknDSambfPzI0/xNfPtu5HL+6rxweQoyuR5fzprF5Rj9bZRSaUnDSakEJFcJCvRYyJXWX1PQL5que15h+egn+S18l14GSak0ouGkVGJEyBLcmpyvbeVEpe40j/+D0IVN+PKTYfx9+pLd1SmV4Wk4KZUUv6zkbzcGuq8iJrAML5z9iDOfNOC7+f8lJlZvEa+UqyQZTiLS0Gm4RIJpbV1VlFLuxqdgRQr0W875phMo7XOSp7c8y8LRzxO266DdpSmVISXXchrrNPxjgmlvpnItSrk3EXI+/DzZBkZwonRH2t5YRNDsBnw5eRwnL+ot4pVKTcmFk9xhOLHnSnmGgFwU6jSJG11+RbLmo+uxYewf15Sflq0kTn8bpVSqSC6czB2GE3uulEfxC6pJ/oHrOV3nPwTLfpqvbscPH3Qn4oBeBkmp+yVJdY0VkfPAKhytpDrWMNbzR4wxgS6vMAmhoaEmPDzczhKUAsBc/Iejc16jSNQijpi8rAh6lZZPvkhgVj+7S1PKrYjIZmNMaLLzJRNO9ZJa2Bjzxz3Ulmo0nJS7ubrvDy7P60++awdYRQgX6/2H5vUexstLj4IrBakUToms1BeoCBw1xpy8j/pShYaTcktxNzi5bDzZwsbiFR/LT1mepNLT71KheH67K1PKdikNp+S6kn8uIhWs4RzANmAGsFVEOqZKpUp0gRxTAAAYP0lEQVRlNN6+5Hv0Nfz7b+ZkkcZ0uPodWac/wrczJnPh2g27q1MqXUiuQ0QdY8xOa7grsNcYUwmoBrzu0sqUSuckR2GKvvw9lzvMI8A/M50ODCJiTDN+WR2ml0FSKhnJhdN1p+EmwM8AxpjjLqtIqQwma9lG5B0UzvEaQ6nBDhosa8HsD/uwJ8r2I+NKua3kwum8iLQQkapAbWAJgIj4AJldXZxSGYZPJgo0H4Jf33BOFmpAh8vf4D/lEb6bOY1L0XqoT6mEkgun7kBv4Eugv1OLqRHwX1cWplRG5BVYlGLdf+DSkz8Q4J+JZ/a9yubRzflt/SY91KeUk7vqredutLeeStdiYzi25ENyhX+MMYYFOZ6hWse3KFUwj92VKeUyqfU7pwlJLWyM6XsPtaUaDSeVEcSdO0zU9wMofmIZB00BNpQdyhPtOhGQycfu0pRKdakVTteBHcAc4BgJrqdnjPn6Puu8LxpOKiO5sP0Xri8cSN7rR1nhVQtpNoJ61UMQ0R/wqowjtcIpN/Ak8DQQC8wGfjTGnEutQu+HhpPKcGJjOPrf0eTe+gnxRliUsxPVn3mLEvltvVKYUqkmVX6Ea4w5Y4z53BjTAOgC5AR2ikjn1ClTKXUbHz8Kt3obnz6bOJXvYZ66MA3z2cPMnfMN0Tf05obKc6ToTrgiEgL0BzoBvwCbU7DMdBE5KSI7nMYFi0iYiESISLiI1LDGi4hMEJH9IhJpbU8pj+WTO4jivX7mfOuZZMsE7Xf1Zu2olqzZvM3u0pRKE8ldvmiYiGwGXgX+AEKNMS8aY3alYN1fAc0SjBsDDDPGBANvW88BHgNKW49uwKQUvwKlMrCcwS3I+/pWDlfpzyNxm6i6oAk/jH+NI6fO212aUi6VXMvpLSAHUAUYCWyxWjbbRSQyqQWNMauAswlHA9mt4Rw4OlkAtAJmGIcwIKeIFLyL16FUxuXrT7E2w5BeGziVpyZPnptCzMSHmffjLGJi9VCfypiS66taIpW31x/4VUTG4gjGh63xhYEjTvNFWeP+SbgCEemGo3VFsWLFUrk8pdxXprwPENRnIWe3zCfn4sG03f4Ky3bNJEvLUTwUXNHu8pRKVcl1iPg7sQeO8HjkHrbXAxhgjCkKDACmWeMT6yubaDdCY8xkY0yoMSY0b96891CCUulbrpBW5Bm8lb8r9qZuXBiVfmrE3E+GcOzMRbtLUyrVJHfOKbuIDBWRiSLS1Oq40Ac4ADx1D9t7HphnDf8A1LCGo4CiTvMV4X+H/JRSCflmpnj74ZieYZzOXY32ZyZxZcJDzP95Dtdj4+2uTqn7ltw5p2+AB4HtwEvAUqA90MoY0+oetncMuHl33YbAPmt4AfCcFX61gAvGmH8d0lNK3c4vXymC+vyXU49/SaDvDVpFvMyq0a3ZtD0lfZaUcl/J/Qh3u3X/JkTEGzgNFDPGXEp2xSKzgPpAHuAE8A6wBxiP41xXNNDTGLNZHD+Bn4ijd99VoKsxJtlf1+qPcJVycv0qB39+n8K7JhNtfPkt/4vUeWYo+XJmtbsypW5JrStEbDHGhNzpud00nJT6t5gTe/lnVh+Czoex1xRjb7W3efTxdvh6p+hnjUq5VKpcIQKoIiIXrccloPLNYRHRs69KuSG//GUI6reEk49NI5dPNC22vMSqka3ZtH1n8gsr5SaS663nbYzJbj2yGWN8nIazJ7WsUspGIuSr2Z7cgyM4UL4Xj8Suo9zchvw08XX+OXvB7uqUSpa285XKwCRTFh54agT0DONk7uq0Of0F18bXYuG8b/QHvMqtaTgp5QH88pXigb6LOPXEt2TxFVpG9mbDyOaEbd5id2lKJUrDSSkPkjekJfmHbOVA5YFUj9tK8IKmLBjfl6iTZ+wuTanbaDgp5Wl8/Hig7dt49dlEVL76PHHua/i0JgtnTyH6eqzd1SkFaDgp5bH8chenVK+5nGk/Fy+/LLTc/RoRoxqzdkMYSf3ERKm0oOGklIfLXbEJhQaHczD0TSrF76H64uYs/qg7h46dtLs05cE0nJRS4O1LiRaDyDRgK4cKPc7jF2fj/0VNFs6cwNWYG3ZXpzyQhpNS6hbfHAUo0/0bznZcxI3MeWi57y3+HFWP1WtW6qE+laY0nJRS/5LrwToUfT2MQw8NpxSHeei3Nvz6YRcOHImyuzTlITSclFKJ8/Im6NHeZBm4jb+Ktafp5fnkmPoQi74ew+Xo63ZXpzI4DSelVJK8s+bmwRencLHzb1zKUowWB4dzaPTDrFy+RA/1KZfRcFJKpUjOktUJGrSGv+t+RGFOUfePDvw+piN7DxyyuzSVAWk4KaVSToTiDV8gx+uR7H2gM/WuLSXf1w/z32nvceHKNburUxmIhpNS6q55Zc5B2ec/4doLf3AmWzkeP/Ihxz+oxfKl84mP10N96v5pOCml7ln2YpUoOXAZRxpPIpfXFRque45Vo9uwa88eu0tT6ZyGk1Lq/ohQ9JFnyDM4gj/LdOfhmNUU+64ui78YyrmLl+2uTqVTGk5KqVQhflkp+8wYYrqv41jOajT/5zPOjavBskXfE6eH+tRd0nBSSqWqbAUfpMyAxRx97CsCvONpHN6dsFHN2b5zu92lqXREw0kp5RKFa7Yh/5Ct/Fm+P9Wuh1N6TgOWfPoqp87pbeJV8jSclFIuI76ZKfvUMOJ7buJQ7ro0OzWNmI9D+W3eNG7obeJVEjSclFIuF5AviLJ953Gs1WwkU2aaRL5K5MgGhG9aZ3dpyk1pOCml0kyhqs0oNGQze6q+SZm4/QQvepxl47pw5Ogxu0tTbkbDSSmVpsTblwdbDSLTqxHsKdyWhhd+JsvkGvw6YyRXrsXYXZ5yExpOSilb+GXPR4Vu0zjXeRnnAkrw6IFRRI2pyerfF+gFZZWGk1LKXrlLhVLy9VUcqPcJueQydVZ3Zu2oVuzZs9vu0pSNNJyUUvYT4YEGz5F78DZ2ln6F0Jj1FP2uHksnDeTMufN2V6dsoOGklHIbXn5ZqPDsaK6/EsahXA/T9MRUoseHsnzeVO167mE0nJRSbid7gZKU7/czR1vNJt43Cw0jB7JjZH22bFprd2kqjWg4KaXcVuGqzSgyJJzdVd+mZNwBKi9qwYpxz3P02FG7S1MupuGklHJr4u1LuVYDyTQggt2F21H3wnwCvqjJshnDuRqtXc8zKg0npVS64J8jL5W6TeVs5985naUkjQ+MIWp0Ddb8Pl+7nmdAGk5KqXQlb6lqlB60kv31PyWnXOGR1c+xfvQT7N27y+7SVCrScFJKpT8ilKrfidyDI4ks3ZOq0WEUnVmP3ycN4Ox5vep5RqDhpJRKt7z9Aqj87EhuvLKRvwLr0OjEdKI/DmHlvCnEatfzdM1l4SQi00XkpIjsSDC+j4jsEZGdIjLGafxQEdlvTXvUVXUppTKe7AVKULH/PI60+oEbvtmpH/kaO0fWIyJ8jd2lqXvkypbTV0Az5xEi0gBoBVQ2xlQAxlrjywMdgArWMp+JiLcLa1NKZUBFqzal2JBN7Kz6LsXjDlFpYQv++Og5jh2Lsrs0dZdcFk7GmFXA2QSjewCjjDEx1jwnrfGtgO+NMTHGmIPAfqCGq2pTSmVc4u1DhVYD8H81gu2Fn6L2+YVk/qImv88YzjXtep5upPU5pzJAHRHZICJ/iEh1a3xh4IjTfFHWOKWUuif+2fMQ3G0yZzv/zsksZWh0YAxHR1dn/e8/a9fzdCCtw8kHCARqAYOAOSIigCQyb6KfHhHpJiLhIhJ+6tQp11WqlMoQ8pUK4cFBy9lbfxJZJZqHVj/PhtEt2Kddz91aWodTFDDPOGwE4oE81viiTvMVARK9NaYxZrIxJtQYE5o3b16XF6yUygBEKFP/GfIOjiCidG+qRG+i6My6rJjUn3Pn9arn7iitw+lnoCGAiJQBMgGngQVABxHxE5ESQGlgYxrXppTK4Lz9Agh+djjXe2xkb676NDjxJdEfh7Bq3ufa9dzNuLIr+SxgPfCgiESJyIvAdOABq3v598DzVitqJzAH2AUsAXoZY/STopRyiRz5g6jcby6HnviRaN+c1I0czJ8ja7M1bLndpSmLpOcTg6GhoSY8PNzuMpRS6ZiJi2XH4kkU2jyW3JxnbZYmFG4/kqASpe0uLUMSkc3GmNDk5tMrRCilPJp4+1CpZR+yDopga7GuhF5eSb6varPii4Gcv6Dno+yi4aSUUoBflkCqvvAxl19ex/6cD9Pgn6lEfxTCqh8/5UZsrN3leRwNJ6WUcpK7SBkqD/iZQ0/8yBXf3NTd/gb7R9Ri89pf7S7No2g4KaVUIoJCGvPA0DB21BhNHnOGar89RdiYVhzcv9vu0jyChpNSSt2BeHlTsfkr5BgUyZYS3ahydR0Fv6nDH5P6cvZcwquzqdSk4aSUUsnIFJCNkOc/IKb7RvbkakC9E18TN74qq+Z8xPUbej7KFTSclFIqhXIWLEGVfj/wd5sFnM9UkLq73uXQyBqE/7FIr9eXyjSclFLqLhWvUo9SQ9ax86Fx5DAXCF3xLJvGtOCvvdvtLi3D0HBSSql7IF5eVHj0RXINjmRLyV5UvLaJIjPr88enPThz5rTd5aV7Gk5KKXUffP2zENJ5BDd6hLMrd1PqnfoOJlRl1awxxFy/bnd56ZaGk1JKpYIc+YtRte8sjrRfzGn/4tTdM5yokaFs/P0nPR91DzSclFIqFRWtWJsHh6xm5yMTCSCaGqu7sHnUo+zbtdXu0tIVDSellEptIlRo3Jm8QyLYUrofZWMiCZrdiDWfvMSpU8ftri5d0HBSSikX8fELIOTZ94jvtZnteVvw0Om5+E6sxqpvhxMdHW13eW5Nw0kppVwse97ChPSewT8dfuWfzKWpu38M/4yuxqbfZuv5qDvQcFJKqTRSpFxNyg1ewe56X5BJ4qi+thsRIxuzd/smu0tzOxpOSimVlkQo16ADBYZuY3PZQZS6vosH5jZl7YQunDxx1O7q3IaGk1JK2cDb149qHd6EvlvZVqAtNc/Mx/+zUFbPeJfo6Gt2l2c7DSellLJRtlwFqNZjGic7LedIQAXqHPiIk6OrsuGXGZj4eLvLs42Gk1JKuYFCpatSYfAy/mw0HcSHmhv6sHNEHXZsXG53abbQcFJKKTdStk47Cg/dwpZKb1Eo9jAVF7dhw9i2HP7Ls25yqOGklFJuxts3EyHtXiPzwEjCi71IlUurKDDjEdZ81oOzp0/aXV6a0HBSSik3lTlbIKEvjONK903syNWEh0/MwuuTqqz+5r0M32lCw0kppdxc7kIlCOn3PVFPL+FY5jLU+etDTo8KJmzhNOLjMmanCQ0npZRKJ4qVr0X5wcvZ3ehLYr39qLX5VfaMfIjI9b/aXVqq03BSSqn0RIRyddpSbOgWtga/T97YE1T+9Sk2jWnBwb2RdleXajSclFIqHfLy8aFq675kHRTJpqBXqHB1I4Vn1mftxJc4dfKY3eXdNw0npZRKx/yzZKd6l9Fc7xHO9rwtqHVqLn6fVmP1V29x9eplu8u7ZxpOSimVAeTMX4xqvWdw/JnlHM5SiTqHJnB+TDDrf55EXFyc3eXdNQ0npZTKQAo/GELF15ey99FvifbJxkMRQ/hrRA0iVi1MV7fn0HBSSqkMqMxDLSnxRjgRoaPJGX+O4OWd2Dq6Gft2httdWopoOCmlVAYlXt4Et3iFnK9vJ7xUX8pEb6PEnCasG/8cJ44dtru8JGk4KaVUBpcpcxZCO71PfO+tRORvS/Wzi8j6RXVWTxvM5csX7S4vURpOSinlIbLnKUhoz2mcfu4P9merTp0jn3NlbBXWzp1A7I0bdpd3Gw0npZTyMAVLVqLKa4vY//hcLvrmpfaOt/h7ZCibl89zm04TGk5KKeWhSlVvQqmhYUTW+ojM5hrVVnVl26hG7I0Ms7s0DSellPJk4uVF5WYvkHfINsIffI0SMXso+WMzwj7qyNHDB2yry2XhJCLTReSkiOxIZNprImJEJI/1XERkgojsF5FIEQlxVV1KKaX+zdcvM6Ed38Kr31a2FupIyPmlBE6rxZopA7hw/mya1+PKltNXQLOEI0WkKNAEcO7H+BhQ2np0Aya5sC6llFJ3kC0wH6HdJ3H+hbXsyVGbR45O58bHwayd/QHXr19PszpcFk7GmFVAYnH7EfA64HzWrRUwwziEATlFpKCralNKKZW0fMXLUvXVnzjQej5nMhWl9u7/cHRUNa5evpAm2/dJk61YROQJ4KgxZpuIOE8qDBxxeh5ljfsnkXV0w9G6olixYq4rVimlFA8E18dUXs2OFbO4eiCMEllzpMl20yycRCQA+D+gaWKTExmXaH9GY8xkYDJAaGioe/R5VEqpDEy8vKjY6Flo9GyabTMtW04lgRLAzVZTEWCLiNTA0VIq6jRvESD935BEKaXUPUmzruTGmO3GmHzGmCBjTBCOQAoxxhwHFgDPWb32agEXjDH/OqSnlFLKM7iyK/ksYD3woIhEiciLScy+GDgA7AemAD1dVZdSSin357LDesaYjslMD3IaNkAvV9WilFIqfdErRCillHI7Gk5KKaXcjoaTUkopt6PhpJRSyu2Iu9y7416IyCng7/tcTR7gdCqUk9HpfkoZ3U/J032UMhl1PxU3xuRNbqZ0HU6pQUTCjTGhdtfh7nQ/pYzup+TpPkoZT99PelhPKaWU29FwUkop5XY0nKyLyKpk6X5KGd1PydN9lDIevZ88/pyTUkop96MtJ6WUUm5Hw0kppZTb8dhwEpFmIrJHRPaLyBC763FHIlJURFaIyG4R2Ski/eyuyZ2JiLeIbBWRRXbX4q5EJKeIzBWRP63P1UN21+SORGSA9X9uh4jMEhF/u2tKax4ZTiLiDXwKPAaUBzqKSHl7q3JLscBAY0w5oBbQS/dTkvoBu+0uws2NB5YYY8oCVdD99S8iUhjoC4QaYyoC3kAHe6tKex4ZTkANYL8x5oAx5jrwPdDK5prcjjHmH2PMFmv4Eo4/JIXtrco9iUgR4HFgqt21uCsRyQ7UBaYBGGOuG2PO21uV2/IBMouIDxCAB94Z3FPDqTBwxOl5FPpHN0kiEgRUBTbYW4nb+hh4HYi3uxA39gBwCvjSOvw5VUSy2F2UuzHGHAXGAoeBf3DcGXypvVWlPU8NJ0lknPapvwMRyQr8CPQ3xly0ux53IyItgJPGmM121+LmfIAQYJIxpipwBdDzvQmISCCOIzklgEJAFhHpZG9Vac9TwykKKOr0vAge2GxOCRHxxRFMM40x8+yux03VBp4QkUM4DhE3FJFv7S3JLUUBUcaYm63vuTjCSt2uMXDQGHPKGHMDmAc8bHNNac5Tw2kTUFpESohIJhwnGxfYXJPbERHBcX5gtzFmnN31uCtjzFBjTBFjTBCOz9JyY4zHfdNNjjHmOHBERB60RjUCdtlYkrs6DNQSkQDr/2AjPLDjiI/dBdjBGBMrIr2BX3H0hJlujNlpc1nuqDbQGdguIhHWuDeMMYttrEmlb32AmdaXwgNAV5vrcTvGmA0iMhfYgqPH7FY88FJGevkipZRSbsdTD+sppZRyYxpOSiml3I6Gk1JKKbej4aSUUsrtaDgppZRyOxpOSqUyEYkTkQjritI/iEjAXS4/9W4usCsiXURk4t1XqpT70nBSKvVdM8YEW1eUvg68ktIFRcTbGPOSMUZ/nKo8moaTUq61GigFICKdRGSj1ar6wrp1CyJyWUTeE5ENwEMislJEQq1pHUVku9UKG31zpSLSVUT2isgfOH4sfXP8k9a820RkVZq+UqVSkYaTUi5i3e7gMRxX2CgHPA3UNsYEA3HAs9asWYAdxpiaxpg1TssXAkYDDYFgoLqItBaRgsAwHKHUBMc9yW56G3jUGFMFeMKlL1ApF/LIyxcp5WKZnS73tBrH9Qm7AdWATY7LpZEZOGnNE4fj4roJVQdWGmNOAYjITBz3QyLB+NlAGWv8WuArEZmD44KhSqVLGk5Kpb5rVuvoFusCnl8bY4YmMn+0MSYukfGJ3drlpkSvO2aMeUVEauK48WGEiAQbY86ktHCl3IUe1lMqbfwOtBeRfAAikktEiiezzAagnojksc5PdQT+sMbXF5Hc1i1Nnry5gIiUNMZsMMa8DZzm9lvDKJVuaMtJqTRgjNklIm8CS0XEC7gB9AL+TmKZf0RkKLACRytqsTFmPoCIvAusx3Gn1C04rq4P8IGIlLbm/x3Y5ppXpJRr6VXJlVJKuR09rKeUUsrtaDgppZRyOxpOSiml3I6Gk1JKKbej4aSUUsrtaDgppZRyOxpOSiml3M7/A8i7Hs+VYvTAAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = train_model(\n",
    "    learning_rate=0.01,\n",
    "    steps=500,\n",
    "    batch_size=5,\n",
    "    training_examples=selected_training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=selected_validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
